/**
*
*
*\author Isabel Martín Herrero 48539974 S
*
*
**/
#include <iostream>
#include "IDibujable.h"
#include "Coordenada.h"


/**
*\file Figura2D.h
*\brief Archivo .h de la clase Lienzo
*Archivo que contiene la declaración la clase Lienzo
*
**/
using namespace std;

#ifndef _LAGARTO_H_
#define _LAGARTO_H_

/** \brief Miembro color
*
* contiene todos los posibles colores que podran tener las figuras, vector de strings;
*/
const string color [] = {"none", "black", "silver", "gray", "white", "maroon", "red", "purple", "fuchsia", "green", "lime", "olive", "yellow", "navy", "blue", "teal", "aqua"};
/** \brief Miembro enum Color
*
* contiene todos los posibles colores que podran tener las figuras;
*/
enum Color{none,black,silver,gray,white, maroon,red , purple, fuchsia, green,lime, oliva, yellow,navy,blue,teal, aqua };

/** \brief Clase Figura2D
 *
 * La clase Figura2D  permite crear, destruir y modificar objetos de tipo Figura2D.Un objeto Lienzo tiene los atributos privados origen, grosor linea, color fondo, color linea, agrupada
 * La clase Figura2D es amiga de ostream, hereda de IDibujable;
 */

class Figura2D: public IDibujable
{
	/** \brief Sobrecarga del operador de salida de Figura2D
	*
	* Función amiga. Sobrecarga el operador de flujo de entrada para que lea un fichero y saque datos de él
	* \param os Toma como parámetro un objeto de tipo flujo de entrada
	* \param f Lienzo que se modificará tras la lectura del fichero
	* \return Devuelve un objeto de tipo ostream
	*/
	friend ostream& operator<<(ostream& os, const Figura2D& f);
	private:
	
		/** \brief Miembro origen.
		*
		*Coordenada que contiene el origen;
		*/
		Coordenada origen;
		
		/** \brief Miembro colorLinea.
		*
		* int que contiene el identificador del color;
		*/
		int grosorLinea;
		
		/** \brief Miembro colorLinea.
		*
		*Color que tiene la linea;
		*/
		Color colorFondo;
		
		/** \brief Miembro colorFondo.
		*
		*Color que tiene la linea;
		*/
		Color colorLinea;
		
		
	protected:
	
		/** \brief Miembro agrupada.
		*
		*bool  indica si la figura esta o no agrupada;
		*/	
		bool agrupada;
		/** \brief Miembro oculta
		*
		*bool  indica si la figura esta o no oculta
		*/
		bool oculta;
		
	public:
	
		/** \brief Constructor de la clase Figura2D
		*
		* Crea un objeto de tipo Figura2D. Los valores por defecto son origen =0.0, grosor = 1, color =black, color= none;
		*/
		Figura2D( Coordenada = (0.0,0.0), int  = 1, Color  = black, Color = none);
		
		/** \brief Constructor de la clase Rectangulo
		*
		* Crea un objeto de tipo rectángulo. Los valores por defecto son origen =0.0, base = 0.0, altura = 0.0.
		*/
		Figura2D(const Figura2D&);
		
		/** \brief Constructor de copia de Figura2D
		*
		* Crea un objeto de tipo rectángulo igual al que se pasa por parametro
		*/
		Figura2D& operator=(const Figura2D&);
		
		/** \brief Metodo getOrigen
		*
		* Retorna la coordena origen de Figura2D;
		*/
		Coordenada getOrigen() const{return origen;};
		
		/** \brief Metodo getFondo
		*
		* Retorna el color de fondo de Figura2D;
		*/
		Color getFondo() const{return colorFondo;};
		
		/** \brief Metodo getLinea
		*
		* Retorna el color de linea de Figura2D;
		*/
		Color getLinea() const{return colorLinea;};
		
		/** \brief Metodo getGrosorLinea
		*
		* Retorna el grosor de la linea de Figura2D;
		*/
		int getGrosorLinea() const{return grosorLinea;};	
		
		/** \brief Metodo esAgrupada
		*
		* Devuelve cierto si la figura es agrupada;
		*/		
		bool esAgrupada() const;
		
		/** \brief Metodo mover
		*
		* Retorna la antigua coordenada cambiando el origen por la coordenada pasada por parametro
		*/
		Coordenada mover(const Coordenada&);
		
		/** \brief Metodo setFondo
		*
		* \param f contiene el fondo
		* Modifica el color de la figura;
		*/
		void setFondo(Color f){colorFondo=f;};
		
		/** \brief Metodo setLinea
		*
		* \param l contiene el color de la linea
		* Modifica la linea de la figura;
		*/
		void setLinea(Color l){colorLinea=l;};
		
		/** \brief Metodo setGrosorLinea
		*
		* \param l contiene el color de la linea
		* Modifica el grosor de la figura;
		*/
		void setGrosorLinea(int l){if(l>=0) grosorLinea=l; else throw ExcepcionValorNoValido(l,"el grosor debe ser positivo o cero");};
		
		/** \brief Metodo setFondo
		*
		* Modifica el valor de agrupar;
		*/		
		void setAgrupada(bool=true);
		
		/** \brief Metodo puedoPintarme
		*
		* Indica si es posible o no pintar la figura;
		*/
		bool puedoPintarme() const;
		
		/** \brief Metodo pintar
		*
		* Saca por pantalla la figura con el formato deseado;
		*/
		void pintar(ostream&) const;
		
		/** \brief Metodo leeEntrada
		*
		* Procesa el fichero de entrada
		*/
		void leeEntrada(istream&);
		
		/** \brief Metodo duplicar
		*
		* crea una nueva figura2d identica a la que tiene el mismo origen que se pasa por referencia;
		*/		
		virtual Figura2D* duplicar(const Coordenada &);
		
		/** \brief Destructor de la clase Figura2D
		*
		* Libera la memoria ocupada por un objeto de tipo Figura2D
		*/
		virtual ~Figura2D();
		
		/** \brief clonar()
		*
		* Libera crea una figura2D neva igual a la anterior
		*/
		
		virtual Figura2D* clonar();
		
		/** \brief clonar()
		*
		* crea una figura2D neva igual a la anterior
		*/
		virtual void escalar(float = 100);
		
		/** \brief ocultar
		*
		* Oculta una figura 2D
		*/	
		virtual void ocultar(bool = false);
		
		/** \brief  isOculto()
		*
		* Retorna true si la figura ha sido ocultada
		*/
		virtual bool isOculto() const;
};
#endif
